#!/bin/zsh
## Removes all FileWave Client software components (including the catalog and anything inactive)
## The system will stay in its current state, FileWave will no longer have control over any files.
## Removes FileWave client data directory ( includes client state, application monitoring DB, custom inventory field contents )
## Removes FileWave preferences
## Sean Holden - 2019.12.10
## Sean Holden - 2022.12.02 - Updated to allow for client versions that no longer use FileWave VNC

# Uncomment the following three lines for a detailed logfile 
# exec >/var/log/filewaveclient-uninstaller.log
# exec 2>&1
# set -x

current_user_id=$(stat -f%u /dev/console)
pkg_list=("com.filewave.fwserver.pkg" "com.filewave.fwbooster.pkg" "com.filewave.admin.pkg")

function remove_file {

	if [[ "$1" != "" ]]
	then
		echo "Remove : $1"
		rm -rf "${1}"*
	fi
}

function unload_service {

	if [[ "$1" != "" ]]
	then

		echo "Unload service: $1"
	
		if [[ "$1" =~ "LaunchAgent" ]]
		then
			launchctl bootout gui/${current_user_id} ${1}
		else
			launchctl bootout system ${1}
		fi
	else
		echo "No service name for $2.  No attempt to unload"
	fi
}

function terminate_service {

	pgrep -x "$1"

	if [ $? -eq 0 ]
	then
		echo "Killing service: $1"
		killall "$1"	
	fi
}

function check_removal {

	remove_me=1

	while [ $# -gt 0 ]
	do
		case $1 in

			fwcontrol)
				check_me="fwcontrol"
				;;
			FileWaveCore)
				check_me="FileWaveCore"
				;;
			*)
				find_fw=$(pkgutil --files $1 2>/dev/null | grep -m 1 "$check_me")

				if [[ "$find_fw" != "" ]]
				then
					echo "Found: $find_fw in: $1"
					remove_me=0
					break
				fi
			esac
		shift
	done
}

##################
## Script Start ##
##################

pkgutil --pkgs=com.filewave.fwcld.pkg

if [ $? -ne 0 ]
then
	echo "PKG receipt not found... exiting!"
	exit 0
fi

# Check PKG receipt for certain files and their locations
while read line
do
	case $line in

		*"FileWaveCore.framework")
			fw_framework="/$line"		
			;;
		*"com.filewave.fwGUI.plist")
			fw_fwgui_service="/$line"
			;;
		*"com.filewave.fwVNCServer.plist")
			fw_vnc_service="/$line"
			;;
		*"com.filewave.fwcld.plist")
			fw_fwcld_service="/$line"
			;;
		*"FileWave.app")
			fw_app="/$line"
			;;
		*"filewave-vnc-server")
			fw_vnc="/$line"
			;;
		*"fwcontrol")
			fw_control="/$line"
			;;
		*"fwcontrol.1")
			fw_control_man="/$line"
			;;
	esac
done< <(pkgutil --files com.filewave.fwcld.pkg)

# Stop services
unload_service "$fw_fwgui_service" "fw_fwgui_service"
unload_service "$fw_vnc_service" "fw_vnc_service"
unload_service "$fw_fwcld_service" "fw_fwcld_service"

# Remove service files
remove_file "$fw_fwgui_service"
remove_file "$fw_vnc_service"
remove_file "$fw_fwcld_service"

# Double check they are terminated
terminate_service "OSXvnc-server"
terminate_service "fwGUI"
terminate_service "fwcld"
terminate_service "filewave-vnc-server"

# Remove files
remove_file "/usr/local/etc/fwcld.plist"
remove_file "/Library/Preferences/com.filewave.plist"
remove_file "/Library/Preferences/com.filewave.WinClient.plist"
remove_file "/Library/Preferences/com.filewave.Client.plist"
remove_file "/Applications/FileWave\ Kiosk.app"
remove_file "/usr/local/etc/.fwVNCServerAuth"
remove_file "/usr/local/etc/engagex.plist"
remove_file "$fw_app"
remove_file "$fw_vnc"
remove_file "/var/FileWave/"
remove_file "/usr/local/etc/FileWaveInstallers"

# Remove user data
echo "Removing user data..."
rm -f /Users/*/Library/Preferences/com.filewave*.plist
rm -f /Users/*/Library/Application\ Support/FileWave/FWGUI.log

# Remove log files
remove_file "/Library/Application\ Support/FileWave/FWGUI.log"
remove_file "/var/log/fwcld"
remove_file "/var/log/fwVNCServer.log"
remove_file "/var/log/fwzmqbroker_client.log"
remove_file "/usr/local/etc/FileWaveInstallerLogfiles/.success"
remove_file "/usr/local/etc/FileWaveInstallerLogfiles/"

# Shared resources should only be left behind if required.
# Shared resource: fwcontrol
check_removal fwcontrol ${pkg_list[@]}

if [ $remove_me -eq 1 ]
then
	echo "fwcontrol not required for other services"
	remove_file "$fw_control"
	remove_file "$fw_control_man"
fi

# Shared resource: FileWaveCore.framework
check_removal FileWaveCore ${pkg_list[@]}

if [ $remove_me -eq 1 ]
then
	echo "FileWaveCore.framework not required for other services"
	remove_file "$fw_framework"
fi

# Forget package
pkgutil --forget "com.filewave.fwcld.pkg"

# Remove the activation script for this
remove_file /usr/local/etc/FWUninstaller.sh

# Remove self
remove_file "$0"

# Remove LaunchDaemon
remove_file /Library/LaunchDaemons/com.filewave.uninstaller.plist

# Stop LaunchDaemon
launchctl bootout system/com.filewave.uninstaller
